package base.thread_JUC.demo04;

import java.util.concurrent.CyclicBarrier;

/** MYNOTICE
 * JUC：CyclicBarrier 使用
 * 允许一组线程全部等待彼此达到共同屏障点的同步辅助
 * 与 CountDownLatch 的区别是，CountDownLatch是从设定值-1直至为0，CyclicBarrier 是+1直至达到设定值。
 */
public class Client2 {

    public static void main(String[] args) {

        CyclicBarrier cyclicBarrier = new CyclicBarrier(7, ()->{
            System.out.println(Thread.currentThread().getName()+"\t 集齐7龙珠，开始召唤神龙");
        });

        for (int i = 1; i <= 7; i++) {
            final int temp = i;
            new Thread(()->{
                System.out.println(Thread.currentThread().getName()+"\t 集齐第"+temp+"颗龙珠");
                try {
                    /**
                     * 每个线程走到这里都会阻塞，直到+1的结果等于设定值7。最后这7个线程谁去唤醒CyclicBarrier里面指定的线程任务是不确定的。
                     * 1	 集齐第1颗龙珠
                     * 5	 集齐第5颗龙珠
                     * 4	 集齐第4颗龙珠
                     * 3	 集齐第3颗龙珠
                     * 2	 集齐第2颗龙珠
                     * 7	 集齐第7颗龙珠
                     * 6	 集齐第6颗龙珠
                     * 5	 集齐7龙珠，开始召唤神龙
                     */
                    cyclicBarrier.await();
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }, String.valueOf(i)).start();
        }
    }

}
